package cn.demoncat.util.mybatis.base;

import cn.demoncat.util.lang.entity.tree.TreeEntity;
import cn.demoncat.util.lang.fn.Consumer2;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * 描述：树型数据的基类 
 * <br/>
 * 说明：实体类继承本类后，可以获得通用的树型属性；建议Dao和Service也继承 BaseTree系，从而获得通用的树模型操作。
 *
 * @author 延晓磊
 *
 * @since 2017年3月26日
 */
public class BaseTreeEntity<T, P extends Serializable> extends BaseEntity<T, P> implements TreeEntity<T,P> {

	private static final long serialVersionUID = 1L;

	// 名称(必须)
	protected String name;
	// 父ID(必须)
	protected P parentId;
	// 节点等级
	protected Integer nodeLevel;
	// 子节点数（用于列表展示子节点数；必须同时有version字段，增删数据时使用Cas方法安全修改）
	protected Integer subCount;
	// 排序
	protected Long sort;
	// 版本号：Mapper.xml中version字段默认每次更新+1
	protected Long version;

	// 是否选中(ext)：null/0 否，1 是
	protected Integer checked = 0;
	// 是否禁用(ext)：null/0 否，1 是
	protected Integer chkDisabled = 0;
	// 子节点集(ext)
	protected List<T> children;
	// 标题/全名(ext)
	private String title;
	// 树ID(ext)
	private String treeId;

	/**
	 * 转换列表为 BaseTreeEntity
	 *
	 * @param list
	 * @param convertor	通过a设置b的{id,name,parent}等属性
	 * @return
	 */
	public static <E>List<BaseTreeEntity> build(Collection<E> list, Consumer2<E,BaseTreeEntity> convertor){
		List<BaseTreeEntity> entities = new ArrayList<>(list.size());
		BaseTreeEntity entity;
		for (E e : list) {
			entity = new BaseTreeEntity();
			convertor.accept(e, entity);
		    entities.add(entity);
		}
		return entities;
	}


	/**
	 * 名称
	 */
	public String getName() {
		return this.name;
	}
			
	/**
	 * 名称
	 */
	public void setName(String name) {
		this.name = name;
	}
	/**
	 * 节点等级
	 */
	public Integer getNodeLevel() {
		return this.nodeLevel;
	}

	/**
	 * 节点等级
	 */
	public void setNodeLevel(Integer nodeLevel) {
		this.nodeLevel = nodeLevel;
	}

	/**
	 * 父ID
	 */
	public P getParentId() {
		return this.parentId;
	}

	/**
	 * 父ID
	 */
	public void setParentId(P parentId) {
		this.parentId = parentId;
	}

	/**
	 * 子节点数
	 */
	public Integer getSubCount() {
		return this.subCount;
	}

	/**
	 * 子节点数
	 */
	public void setSubCount(Integer subCount) {
		this.subCount = subCount;
	}

	/**
	 * 版本号
	 */
	public Long getVersion() {
		return this.version;
	}

	/**
	 * 版本号
	 */
	public void setVersion(Long version) {
		this.version = version;
	}

	
	/**
	 *
	 * 功能描述：子节点集(ext)
	 *
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年3月26日
	 */
	public List<T> getChildren() {
		return children;
	}

	/**
	 * 
	 * 功能描述：子节点集(ext)
	 *
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年3月26日
	 */
	public void setChildren(List<T> children) {
		this.children = children;
	}

	/**
	 * 排序
	 */
	public Long getSort() {
		return this.sort;
	}

	/**
	 * 排序
	 */
	public void setSort(Long sort) {
		this.sort = sort;
	}
	/**
	 * 
	 * 功能描述：是否勾选(ext)
	 *
	 * @return	null/0 否，1 是
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年6月12日
	 */
	public Integer getChecked() {
		return checked;
	}
	/**
	 * 
	 * 功能描述：是否勾选(ext)
	 *
	 * @param checked	null/0 否，1 是
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年6月12日
	 */
	public void setChecked(Integer checked) {
		this.checked = checked;
	}
	/**
	 * 禁止勾选(ext)
	 * 
	 * @return null/0 否，1 是
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年3月22日
	 */
	public Integer getChkDisabled() {
		return chkDisabled;
	}
	/**
	 * 禁止勾选(ext)
	 * 
	 * @param chkDisabled 	null/0 否，1 是
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年3月22日
	 */
	public void setChkDisabled(Integer chkDisabled) {
		this.chkDisabled = chkDisabled;
	}

	/**
	 * 标题/全名(ext)
	 */
	public String getTitle() {
		return title;
	}
	/**
	 * 标题/全名(ext)
	 */
	public void setTitle(String title) {
		this.title = title;
	}

	/**
	 * 树ID(ext)
	 */
	public String getTreeId() {
		return treeId;
	}
	/**
	 * 树ID(ext)
	 */
	public void setTreeId(String treeId) {
		this.treeId = treeId;
	}
}
